跳到主要内容

史上最全git命令集

配置化命令

ssh-keygen
git config --global user.name "whalefall541"
git config --global user.email "jackchen541@sina.com"
git config --global alias.ll "log --graph --pretty=format:'%C(yellow)%h%Creset -%C(cyan)%d%Creset %s %Cgreen(%an, %cr)' --abbrev-commit"
git config --global alias.a '!git add -A && git commit -m'

配置全局.gitignore

# 这里最好写绝对路径 有时候可能不生效
git config --global core.excludesfile D:/project/.gitignore

# .gitignore只能忽略那些原来没有被track的文件,如果某些文件已经被纳入了版本管理中,则修改.gitignore是无效的。
# 解决方法就是先把本地缓存删除(改变成未track状态),然后再提交:

git rm -r --cached .
git add .

查看类命令

# 查看 
git log --graph --pretty=format:'%C(yellow)%h%Creset -%C(cyan)%d%Creset %s %Cgreen(%an, %cr)' --abbrev-commit
# 查看 xxx提交的内容
git show <commit-id>
# 查看引用记录
git reflog
# 查看文件差异
git diff filename

# 查看已经add 但是未commit 的差异
git diff --staged
git diff --cached
# 仅查看汇总统计
git diff --stat branch1 branch2

# 查看两个提交之间某个文件的差异 第一个为开始的hash,要比当前查看的还早一个
git diff <commit> <commit> xxx.java
# 查看两个分支的具体差异
git diff dev st


# 一次diff出全部modify的文件内容 也可以自行重定向到某个文件中
git status | awk -F "modified:" '{if($2 != "") print $2}' | xargs git diff

# 查看已经commit 但是未push的记录
git cherry -v

# 查看某行文件修改人
git blame -L 58,100 filename
git blame -L 57,+10 filename

撤销类命令

# 一次撤销所有的文件
git reset .
git checkout .

r# 撤销掉modify状态
git checkout <filename>
# 撤销掉add的文件(如果是新文件则是untracked状态 否则是modify状态)
git restore --staged test.txt
git rm --cached test.txt

# 撤销 add commit modify(把commit 记录全删掉 慎用)
git reset --hard <commit-id>
# 撤销add、commit (把commit 记录变成modify之后)
git reset --mixed <commit-id>
# 仅撤销commit (把commit 记录变成add之后)
git reset --soft <commit-id>

# 撤销一次提交内容
git revert <commit-id>git

# 删除本地所有 untracked 记录
git clean -df

创建或删除相关命令

# 本地仓库关联到远程仓库
git remote add origin git@github.com:whalefall541/rebase-learn.git
# 删除关联
git remote rm origin

# 删除远程 分支
git push origin -d <branch-name>

# 创建本地 分支
git branch <branch-name>
# 创建并切换
git chekcout -b <branch-name>
# 删除本地 分支
git branch -D <branch-name>

合并类命令

# 关闭自动合并
git merge --no-ff -m "merge with no-ff" dev

# 自动变基 在当前分支重放另一个分支
git rebase [<branch-name> | <commit-id> | <head~n>]

# 交互式变基
git rebase -i <commit-id> <commit-id>

`一般使用 p s组成 将多条commit 合并为一条`
# 注意 rebase时commit id 为前开区间,后闭区间;
# 千万注意rebase时后面的id要是最后一个,除非你不想要在后面id之后的提交记录否则千万不要这么干,
# 如果不小心做了,重新从远程拉取把

# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup [-C | -c] <commit> = like "squash" but keep only the previous
# commit's log message, unless -C is used, in which case
# keep only this commit's message; -c is same as -C but
# opens the editor


# 将base分支的内容变基到当前分支 rebase 就是移动HEAD指针
git rebase <base-branch> <current-branch>

# rebase --onto 可以将一个位于子分支的分支变基到主分支上
# 变基前:current-upsteam-branch 是base-branch的一个子分支
# 而 current-branch 又是 current-upsteam-branch的一个子分支
# 变基后 current-upsteam-branch current-branch 各自为base-branch 的子分支
git rebase --onto <base-branch> <current-upsteam-branch> <current-branch>

# 从其他分支复制某个提交到另一个分支
git cherry-pick <commit-id>

暂存内容命令

git stash
git stash list
git pop

# 暂存部分文件
git stash push filename

# 交互式暂存文件
git stash -p

如何暂存部分文件呢 stash part

提交相关命令

echo "# 123" >> README.md
git init
git add README.md
git commit -m "first commit"
# 修改一下HEAD指向的注释; notes: Don’t amend public commits
git commit --amend -m "an updated commit message" --no-edit

git branch -M main
git remote add origin git@github.com:whalefall541/123.git
git push -u origin main

# 直接在dev分支 推到所有其他分支 从branch1分支推送到branch2
git push origin refs/heads/branch1:branch2

标签类命令

# 在当前分支当前提交上打标签:
git tag v1.0

#如果想要打标签在某个指定历史commit上:
git tag v0.9 f52c633
git tag -a <tagname> -m "<message>"

# 可以通过如下命令查看一个tag信息:
git show v0.1

# 如果标签打错了,也可以删除:
git tag -d v0.1

# 如果要推送某个标签到远程,使用命令git push origin <tagname>
git push origin v1.0
# 或者,一次性推送全部尚未推送到远程的本地标签:
git push origin --tags
# 如果标签已经推送到远程,要删除远程标签就麻烦一点,先从本地删除:
git tag -d v0.9
# 然后,从远程删除。删除命令也是push,但是格式如下:
git push origin :refs/tags/v0.9

更新命令

可以参考这个网站

# 拉取所有分支
git fetch --all
# update某个分支 如果是聚合工程需要加上--recurse-submodules=no
git fetch origin main:main --progress --prune

# 拉取代码时变基 fetch and rebase
git pull -r origin main

如何同步github fork仓库

  1. 配置forked仓库 configuring-a-remote-for-a-fork
  2. Merging an upstream repository into your fork syncing-a-fork
协议
  • 本作品代码部分采用 Apache 2.0协议进行许可。遵循许可的前提下,你可以自由地对代码进行修改,再发布,可以将代码用作商业用途。但要求你:

    • 署名:在原有代码和衍生代码中,保留原作者署名及代码来源信息。
    • 保留许可证:在原有代码和衍生代码中,保留Apache 2.0协议文件。
  • 本作品文档部分采用知识共享署名 4.0 国际许可协议进行许可。 遵循许可的前提下,你可以自由地共享,包括在任何媒介上以任何形式复制、发行本作品,亦可以自由地演绎、修改、转换或以本作品为基础进行二次创作。但要求你:

    • 署名:应在使用本文档的全部或部分内容时候,注明原作者及来源信息。
    • 非商业性使用:不得用于商业出版或其他任何带有商业性质的行为。如需商业使用,请联系作者。
    • 相同方式共享的条件:在本文档基础上演绎、修改的作品,应当继续以知识共享署名 4.0国际许可协议进行许可。